/*******************************************************************************
 * Copyright 2009, 2010 Innovation Gate GmbH. All Rights Reserved.
 * 
 * This file is part of the OpenWGA server platform.
 * 
 * OpenWGA is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * In addition, a special exception is granted by the copyright holders
 * of OpenWGA called "OpenWGA plugin exception". You should have received
 * a copy of this exception along with OpenWGA in file COPYING.
 * If not, see <http://www.openwga.com/gpl-plugin-exception>.
 * 
 * OpenWGA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with OpenWGA in file COPYING.
 * If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/

package de.innovationgate.wgpublisher.events;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import de.innovationgate.webgate.api.WGDatabaseRevision;

public abstract class Event {
    
    public enum Scope {
        CLUSTER,
        SERVER,
        SESSION
    }
    
    private AtomicInteger _cascadingLevel = new AtomicInteger(1);
    private List<EventPath> _cascadingEventsPath = new ArrayList<>();
    private WGDatabaseRevision _databaseRevision;
    private String _sessionId; 
    private String _source;
    
    public Event(WGDatabaseRevision revision, String sessionId) {
        _databaseRevision = revision;
        _sessionId = sessionId;
    }
    
    public void setSource(String id){
    	_source = id;
    }
    
    public String getSource(){
    	return _source;
    }
    
    public String getSessionId() {
        return _sessionId;
    }

    protected int getCascadingLevel() {
        return _cascadingLevel.get();
    }
    
    protected void addCascadingEventPath(List<EventPath> parentPath, EventPath newPath) {
        _cascadingEventsPath = new ArrayList<EventPath>();
        _cascadingEventsPath.addAll(parentPath);
        _cascadingEventsPath.add(newPath);
        _cascadingLevel.set(_cascadingEventsPath.size());
    }

    public abstract String getDatabaseKey();
    
    public abstract Scope getScope();
    
    public abstract Event createLocalDelegate();

    public  WGDatabaseRevision getDatabaseRevision() {
        return _databaseRevision;
    }

    public List<EventPath> getCascadingEventsPath() {
        return _cascadingEventsPath;
    }

}
